; Endlich Buchstaben zeichen (Optimiertes Reassemblat)
; copy_to_bitmap( UBYTE *dest, LONG width, LONG x, LONG y, LONG w, LONG h, UBYTE *src  )
; 29.8.93

EXPORT	copy_to_bitmap, min, max
IMPORT	_lmul

	TEXT
; **** max and min procedures: ****
max:	CMP.L	D1,	D0
	BLT	do_min
do_max:	RTS

min:	CMP.L	D1,	D0
	BLT	do_max
do_min:
	MOVE.L	D1,	D0
	RTS


; **** Copy Char to Bitmap
copy_to_bitmap:
	MOVEM.W	D6-D7,	-(A7)

	ADD.W	D1,	D1
	MOVE.W	D1,	D6	; 2*wweite nach D6
	MULU	D2,	D1
	ADD.L	D1,	A0	; dest += y*wweite

	MOVE.W	D0,	D1
	ASR.W	#3,	D1
	ADD.W	D1,	A0	; dest += x/8 (wegen copyshift!)

	MOVE.W	14(A7),	D2
	SUBQ	#1,	D2	; Hoehe in D2

	MOVE.W	10(A7),	D7	; w = (w+7)/8-1
	ADDQ.W	#7,	D7
	LSR.W	#3,	D7
	SUB.W	D7,	D6	; 2*wweite-w
	SUBQ.W	#1,	D7	; Weite in D5

	ANDI.W	#7,	D0	; x = (x&8)
	BEQ	byteweise	; x&7==0?

; **** Kopieren mit Shiften ****
copyshift:
	MOVEQ	#8,	D1
	SUB.B	D0,	D1	; Verschiebung
	MOVEM.W	D3-D5,	-(A7)

.loop1:	MOVE.W	D7,	D4
.loop2:	MOVE.B	(A1)+,	D3
	MOVE.B	D3,	D5
	LSR.B	D0,	D5
	OR.B	D5,	(A0)+
	LSL.B	D1,	D3
	OR.B	D3,	(A0)
	DBF	D4,	.loop2
	ADDA.W	D6,	A0
	DBF	D2,	.loop1	; while( --h>=0 )
	MOVEM.W	(A7)+,	D3-D7
	RTS

; **** Buchstabe auf Bytegrenze ****
byteweise:
.loop1:	MOVE.W	D7,	D0
.loop2:	MOVE.B	(A1)+,	D1
	OR.B	D1,	(A0)+
	DBF	D0,	.loop2
	ADDA.W	D6,	A0
	DBF	D2,	.loop1	; while( --h>=0 )
	MOVEM.W	(A7)+,	D6-D7
	RTS
